package ar.uba.fi.algo3.algoflight.model;

import java.util.ArrayList;
import java.util.List;

import ar.uba.fi.algo3.algoflight.model.utils.Utilidades;

public class Posicion implements Cloneable {

	private float coordX;

	private float coordY;

	public Posicion(float coordX, float coordY) {
		this.coordX = coordX;
		this.coordY = coordY;
	}

	public Posicion(double coordX, double coordY) {
		this.coordX = Double.valueOf(coordX).floatValue();
		this.coordY = Double.valueOf(coordY).floatValue();
	}

	public float getCoordX() {
		return coordX;
	}

	public float getCoordY() {
		return coordY;
	}

	public void sumarPosicion(Posicion punto) {
		coordX = coordX + punto.coordX;
		coordY = coordY + punto.coordY;
	}

	public boolean estaCercaDe(Posicion otraPosicion, int tolerancia) {

		float posXRedondeada = Utilidades.redondear(this.coordX);
		float posYRedondeada = Utilidades.redondear(this.coordY);
		float maxX = posXRedondeada + tolerancia;
		float maxY = posYRedondeada + tolerancia;
		float minX = posXRedondeada - tolerancia;
		float minY = posYRedondeada - tolerancia;

		float otraPosXRedondeada = Utilidades.redondear(otraPosicion
				.getCoordX());
		float otraPosYRedondeada = Utilidades.redondear(otraPosicion
				.getCoordY());

		return ((otraPosXRedondeada <= maxX) && (otraPosXRedondeada >= minX))
				&& ((otraPosYRedondeada <= maxY) && (otraPosYRedondeada >= minY));
	}

	@Override
	public Posicion clone() {
		return new Posicion(this.coordX, this.coordY);
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;

		boolean resultado = false;

		if (obj instanceof Posicion) {
			resultado = estaCercaDe((Posicion) obj, 0);
		}

		return resultado;
	}

	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result
				+ Float.floatToIntBits(Utilidades.redondear(coordX));
		result = prime * result
				+ Float.floatToIntBits(Utilidades.redondear(coordY));

		return result;
	}

	public Posicion getBordeAleatorio() {
		List<Posicion> randomPosiciones = new ArrayList<Posicion>();

		randomPosiciones.add(new Posicion(
				Utilidades.generarRandom(this.coordX), 0));
		randomPosiciones.add(new Posicion(0, Utilidades
				.generarRandom(this.coordY)));
		randomPosiciones.add(new Posicion(this.coordX, Utilidades
				.generarRandom(this.coordY)));
		randomPosiciones.add(new Posicion(
				Utilidades.generarRandom(this.coordX), this.coordY));

		return randomPosiciones.get(Utilidades.generarRandom(randomPosiciones
				.size()));
	}
}
